package com.ntd.study.base.classe;

import cn.hutool.core.lang.Console;
import ntd.util.UtilProxy;

/**
 * 类的声明周期
 * 1.源代码 - .java文件
 * 2.字节码文件 - .class文件
 * 3.CLass对象 - 由JVM加载进来 - 加载、验证、准备、解析 - 代码能够影响的只有第一步（加载）
 * 4.实例对象
 * 5.使用
 * 6.卸载
 * <p>
 * 加载：默认从classpath里面加载 - 其他自定义加载：本地硬盘、网络、内存
 */
public class ClassLifeCycle {

    public static void main(String[] args) {

    }

    /**
     * 类加载的触发形式
     * 1.new 实例化对象
     * 2.读取一个静态变量
     * 3.调用类的静态方法
     * 4.对类进行反射调用
     * 5.初始化子类，父类会先被初始化
     * 6.对类使用动态代理的时候需要先被初始化
     */
    private static void classLoaderTrigger() throws ClassNotFoundException {
        new DemoClassLoader();
        Console.log(DemoClassLoader.a);
        DemoClassLoader.test();
        java.lang.Class.forName("com.ntd.study.base.classe.ClassLifeCycle.DemoClassLoader");
        new DemoClassLoaderChirden();
        UtilProxy.getProxyInstance(new DemoClassLoader());
    }

    static class DemoClassLoader {
        static int a = 0;

        static void test() {
            Console.log("调用静态方法");
        }
    }

    static class DemoClassLoaderChirden extends DemoClassLoader {
    }

}
